#include <pthread.h>
#include <unistd.h>
#include "BlockQueue.hpp"

using namespace BlockQueueModule;

void* Consumer(void* arg)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(arg);
    while(true)
    {
        // sleep(2);
        // 1.从bq中拿数据
        int data;
        bq->PopQueue(&data);
        // 2.对数据做处理
        printf("消费者消费了一个数据: %d\n", data);
    }
    return nullptr;
}

void* Producer(void* arg)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(arg);
    int data = 0;
    while(true)
    {
        sleep(1);
        // 1.生产数据
        data++;
        // 2.把数据放到bq中
        bq->PushQueue(data);
        printf("生产者生产了一个数据: %d\n", data);
    }
    return nullptr;
}

int main()
{
    //需要让生产者和消费者都看到阻塞队列，所以需要把阻塞队列当成参数传入线程的方法中
    BlockQueue<int> *bq = new BlockQueue<int>();
    pthread_t consumer1, consumer2, producer1, producer2, producer3;
    pthread_create(&consumer1, nullptr, Consumer, (void*)bq);
    pthread_create(&consumer2, nullptr, Consumer, (void*)bq);
    pthread_create(&producer1, nullptr, Producer, (void*)bq);
    pthread_create(&producer2, nullptr, Producer, (void*)bq);
    pthread_create(&producer3, nullptr, Producer, (void*)bq);

    pthread_join(consumer1, nullptr);
    pthread_join(consumer2, nullptr);
    pthread_join(producer1, nullptr);
    pthread_join(producer2, nullptr);
    pthread_join(producer3, nullptr);
    return 0;
}